package com.qfedu.edu.seckill.exception;

import com.qfedu.edu.seckill.result.R;
import com.qfedu.edu.seckill.result.ResponseCode;
import com.qfedu.edu.seckill.utils.ExceptionUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.sql.SQLException;

/**
 * 全局异常的捕获处理
 */
@ControllerAdvice
@Slf4j
public class GlobalException {

    /**
     * 处理业务异常的类
     * @param err
     * @return
     */
    @ExceptionHandler(value =BusinessException.class )
    @ResponseBody
    public R handlerBusinessException(Exception err){
        BusinessException businessException= (BusinessException) err;
        return R.error(businessException.getCode(), businessException.getMsg());
    }

    /**
     * 处理SQL异常
     * @param err
     * @return
     */
    @ExceptionHandler(value = SQLException.class )
    @ResponseBody
    public R handlerSQLException(SQLException err){
        return R.error(ResponseCode.SQL_EXCEPTION);
    }


    /**
     * 处理其他的异常
     * @param err
     * @return
     */
    @ExceptionHandler(value = Exception.class )
    @ResponseBody
    public R handlerException(Exception err){
        //跟以前是一样的
        //这里还需要将这个异常的栈信息给弄成字符串打印出来...
        String exceptionStackMessage = ExceptionUtils.getExceptionStackMessage(err);
        //日志记录
        log.error("出现了系统异常:{}",exceptionStackMessage);
        //同时这里还需要通知(观察者设计模式 通知operator系统出现问题)
        return R.error(ResponseCode.SQL_EXCEPTION);
    }

}
